A number of programming languages are available to provide programmers advantages in programming that are particular to each language. Similarly, numerous processors are available to provide advantages for executing particular tasks that are particular to each processor. For example, embedded processors are particularly suited for handling well defined tasks within electronic devices, whereas a general purpose processor such as an Intel® Pentium® processor is more flexible and can handle complex tasks. Furthermore, there are a variety of tool types created to help programmers deal with an increasing demand for software reliability, security, and high performance. Thus, the diversity in computing environments, configurations, and devices is increasing. Software developers are therefore faced with accommodating and working within a dizzying array of diverse software development scenarios.
The need to address such diversity has complicated the already highly complex field of building software development tools. Such software development tools can comprise various components, such as assemblers, disassemblers, decoders, encoders, instruction selection components, and instruction legalization components. Often, such components have overlapping requirements, and the components themselves may appear in more than one development tool (e.g., in a compiler and a debugger).
Despite the widespread necessity for similar component functionality, it has been challenging to develop tool components that share design and implementation, particularly across a range of programming languages or other program representations. Often, each component for each tool has its own implementation, resulting in much redundant work and duplicated code. Additionally, there may be little uniformity across architectures, even within the same source base. Therefore, any improvements made in the code of one component help a specific implementation, but the improvement is not automatically propagated to other tools or architectures implementing the same functionality. Finally, effort expended to address a particular software development scenario must typically be re-worked to address different scenarios.